home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / distutils / ccompiler.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  38KB  |  987 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''distutils.ccompiler
  5.  
  6. Contains CCompiler, an abstract base class that defines the interface
  7. for the Distutils compiler abstraction model.'''
  8. __revision__ = '$Id: ccompiler.py,v 1.61 2004/11/10 22:23:13 loewis Exp $'
  9. import sys
  10. import os
  11. import re
  12. from types import *
  13. from copy import copy
  14. from distutils.errors import *
  15. from distutils.spawn import spawn
  16. from distutils.file_util import move_file
  17. from distutils.dir_util import mkpath
  18. from distutils.dep_util import newer_pairwise, newer_group
  19. from distutils.sysconfig import python_build
  20. from distutils.util import split_quoted, execute
  21. from distutils import log
  22.  
  23. class CCompiler:
  24.     '''Abstract base class to define the interface that must be implemented
  25.     by real compiler classes.  Also has some utility methods used by
  26.     several compiler classes.
  27.  
  28.     The basic idea behind a compiler abstraction class is that each
  29.     instance can be used for all the compile/link steps in building a
  30.     single project.  Thus, attributes common to all of those compile and
  31.     link steps -- include directories, macros to define, libraries to link
  32.     against, etc. -- are attributes of the compiler instance.  To allow for
  33.     variability in how individual files are treated, most of those
  34.     attributes may be varied on a per-compilation or per-link basis.
  35.     '''
  36.     compiler_type = None
  37.     src_extensions = None
  38.     obj_extension = None
  39.     static_lib_extension = None
  40.     shared_lib_extension = None
  41.     static_lib_format = None
  42.     shared_lib_format = None
  43.     exe_extension = None
  44.     language_map = {
  45.         '.c': 'c',
  46.         '.cc': 'c++',
  47.         '.cpp': 'c++',
  48.         '.cxx': 'c++',
  49.         '.m': 'objc' }
  50.     language_order = [
  51.         'c++',
  52.         'objc',
  53.         'c']
  54.     
  55.     def __init__(self, verbose = 0, dry_run = 0, force = 0):
  56.         self.dry_run = dry_run
  57.         self.force = force
  58.         self.verbose = verbose
  59.         self.output_dir = None
  60.         self.macros = []
  61.         self.include_dirs = []
  62.         self.libraries = []
  63.         self.library_dirs = []
  64.         self.runtime_library_dirs = []
  65.         self.objects = []
  66.         for key in self.executables.keys():
  67.             self.set_executable(key, self.executables[key])
  68.         
  69.  
  70.     
  71.     def set_executables(self, **args):
  72.         """Define the executables (and options for them) that will be run
  73.         to perform the various stages of compilation.  The exact set of
  74.         executables that may be specified here depends on the compiler
  75.         class (via the 'executables' class attribute), but most will have:
  76.           compiler      the C/C++ compiler
  77.           linker_so     linker used to create shared objects and libraries
  78.           linker_exe    linker used to create binary executables
  79.           archiver      static library creator
  80.  
  81.         On platforms with a command-line (Unix, DOS/Windows), each of these
  82.         is a string that will be split into executable name and (optional)
  83.         list of arguments.  (Splitting the string is done similarly to how
  84.         Unix shells operate: words are delimited by spaces, but quotes and
  85.         backslashes can override this.  See
  86.         'distutils.util.split_quoted()'.)
  87.         """
  88.         for key in args.keys():
  89.             if not self.executables.has_key(key):
  90.                 raise ValueError, "unknown executable '%s' for class %s" % (key, self.__class__.__name__)
  91.             
  92.             self.set_executable(key, args[key])
  93.         
  94.  
  95.     
  96.     def set_executable(self, key, value):
  97.         if type(value) is StringType:
  98.             setattr(self, key, split_quoted(value))
  99.         else:
  100.             setattr(self, key, value)
  101.  
  102.     
  103.     def _find_macro(self, name):
  104.         i = 0
  105.         for defn in self.macros:
  106.             if defn[0] == name:
  107.                 return i
  108.             
  109.             i = i + 1
  110.         
  111.  
  112.     
  113.     def _check_macro_definitions(self, definitions):
  114.         """Ensures that every element of 'definitions' is a valid macro
  115.         definition, ie. either (name,value) 2-tuple or a (name,) tuple.  Do
  116.         nothing if all definitions are OK, raise TypeError otherwise.
  117.         """
  118.         for defn in definitions:
  119.             if type(defn) is TupleType:
  120.                 if len(defn) == 1 or len(defn) == 2:
  121.                     if not (type(defn[1]) is StringType or defn[1] is None) and type(defn[0]) is StringType:
  122.                         raise TypeError, "invalid macro definition '%s': " % defn + 'must be tuple (string,), (string, string), or ' + '(string, None)'
  123.                         continue
  124.         
  125.  
  126.     
  127.     def define_macro(self, name, value = None):
  128.         """Define a preprocessor macro for all compilations driven by this
  129.         compiler object.  The optional parameter 'value' should be a
  130.         string; if it is not supplied, then the macro will be defined
  131.         without an explicit value and the exact outcome depends on the
  132.         compiler used (XXX true? does ANSI say anything about this?)
  133.         """
  134.         i = self._find_macro(name)
  135.         if i is not None:
  136.             del self.macros[i]
  137.         
  138.         defn = (name, value)
  139.         self.macros.append(defn)
  140.  
  141.     
  142.     def undefine_macro(self, name):
  143.         """Undefine a preprocessor macro for all compilations driven by
  144.         this compiler object.  If the same macro is defined by
  145.         'define_macro()' and undefined by 'undefine_macro()' the last call
  146.         takes precedence (including multiple redefinitions or
  147.         undefinitions).  If the macro is redefined/undefined on a
  148.         per-compilation basis (ie. in the call to 'compile()'), then that
  149.         takes precedence.
  150.         """
  151.         i = self._find_macro(name)
  152.         if i is not None:
  153.             del self.macros[i]
  154.         
  155.         undefn = (name,)
  156.         self.macros.append(undefn)
  157.  
  158.     
  159.     def add_include_dir(self, dir):
  160.         """Add 'dir' to the list of directories that will be searched for
  161.         header files.  The compiler is instructed to search directories in
  162.         the order in which they are supplied by successive calls to
  163.         'add_include_dir()'.
  164.         """
  165.         self.include_dirs.append(dir)
  166.  
  167.     
  168.     def set_include_dirs(self, dirs):
  169.         """Set the list of directories that will be searched to 'dirs' (a
  170.         list of strings).  Overrides any preceding calls to
  171.         'add_include_dir()'; subsequence calls to 'add_include_dir()' add
  172.         to the list passed to 'set_include_dirs()'.  This does not affect
  173.         any list of standard include directories that the compiler may
  174.         search by default.
  175.         """
  176.         self.include_dirs = copy(dirs)
  177.  
  178.     
  179.     def add_library(self, libname):
  180.         """Add 'libname' to the list of libraries that will be included in
  181.         all links driven by this compiler object.  Note that 'libname'
  182.         should *not* be the name of a file containing a library, but the
  183.         name of the library itself: the actual filename will be inferred by
  184.         the linker, the compiler, or the compiler class (depending on the
  185.         platform).
  186.  
  187.         The linker will be instructed to link against libraries in the
  188.         order they were supplied to 'add_library()' and/or
  189.         'set_libraries()'.  It is perfectly valid to duplicate library
  190.         names; the linker will be instructed to link against libraries as
  191.         many times as they are mentioned.
  192.         """
  193.         self.libraries.append(libname)
  194.  
  195.     
  196.     def set_libraries(self, libnames):
  197.         """Set the list of libraries to be included in all links driven by
  198.         this compiler object to 'libnames' (a list of strings).  This does
  199.         not affect any standard system libraries that the linker may
  200.         include by default.
  201.         """
  202.         self.libraries = copy(libnames)
  203.  
  204.     
  205.     def add_library_dir(self, dir):
  206.         """Add 'dir' to the list of directories that will be searched for
  207.         libraries specified to 'add_library()' and 'set_libraries()'.  The
  208.         linker will be instructed to search for libraries in the order they
  209.         are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
  210.         """
  211.         self.library_dirs.append(dir)
  212.  
  213.     
  214.     def set_library_dirs(self, dirs):
  215.         """Set the list of library search directories to 'dirs' (a list of
  216.         strings).  This does not affect any standard library search path
  217.         that the linker may search by default.
  218.         """
  219.         self.library_dirs = copy(dirs)
  220.  
  221.     
  222.     def add_runtime_library_dir(self, dir):
  223.         """Add 'dir' to the list of directories that will be searched for
  224.         shared libraries at runtime.
  225.         """
  226.         self.runtime_library_dirs.append(dir)
  227.  
  228.     
  229.     def set_runtime_library_dirs(self, dirs):
  230.         """Set the list of directories to search for shared libraries at
  231.         runtime to 'dirs' (a list of strings).  This does not affect any
  232.         standard search path that the runtime linker may search by
  233.         default.
  234.         """
  235.         self.runtime_library_dirs = copy(dirs)
  236.  
  237.     
  238.     def add_link_object(self, object):
  239.         '''Add \'object\' to the list of object files (or analogues, such as
  240.         explicitly named library files or the output of "resource
  241.         compilers") to be included in every link driven by this compiler
  242.         object.
  243.         '''
  244.         self.objects.append(object)
  245.  
  246.     
  247.     def set_link_objects(self, objects):
  248.         """Set the list of object files (or analogues) to be included in
  249.         every link to 'objects'.  This does not affect any standard object
  250.         files that the linker may include by default (such as system
  251.         libraries).
  252.         """
  253.         self.objects = copy(objects)
  254.  
  255.     
  256.     def _setup_compile(self, outdir, macros, incdirs, sources, depends, extra):
  257.         '''Process arguments and decide which source files to compile.
  258.  
  259.         Merges _fix_compile_args() and _prep_compile().
  260.         '''
  261.         if outdir is None:
  262.             outdir = self.output_dir
  263.         elif type(outdir) is not StringType:
  264.             raise TypeError, "'output_dir' must be a string or None"
  265.         
  266.         if macros is None:
  267.             macros = self.macros
  268.         elif type(macros) is ListType:
  269.             if not self.macros:
  270.                 pass
  271.             macros = macros + []
  272.         else:
  273.             raise TypeError, "'macros' (if supplied) must be a list of tuples"
  274.         if incdirs is None:
  275.             incdirs = self.include_dirs
  276.         elif type(incdirs) in (ListType, TupleType):
  277.             if not self.include_dirs:
  278.                 pass
  279.             incdirs = list(incdirs) + []
  280.         else:
  281.             raise TypeError, "'include_dirs' (if supplied) must be a list of strings"
  282.         if extra is None:
  283.             extra = []
  284.         
  285.         objects = self.object_filenames(sources, strip_dir = python_build, output_dir = outdir)
  286.         if not len(objects) == len(sources):
  287.             raise AssertionError
  288.         if self.force:
  289.             skip_source = { }
  290.             for source in sources:
  291.                 skip_source[source] = 0
  292.             
  293.         elif depends is None:
  294.             skip_source = { }
  295.             for source in sources:
  296.                 skip_source[source] = 1
  297.             
  298.             (n_sources, n_objects) = newer_pairwise(sources, objects)
  299.             for source in n_sources:
  300.                 skip_source[source] = 0
  301.             
  302.         else:
  303.             skip_source = { }
  304.             L = depends[:] + [
  305.                 None]
  306.             for i in range(len(objects)):
  307.                 source = sources[i]
  308.                 L[-1] = source
  309.                 if newer_group(L, objects[i]):
  310.                     skip_source[source] = 0
  311.                     continue
  312.                 skip_source[source] = 1
  313.             
  314.         pp_opts = gen_preprocess_options(macros, incdirs)
  315.         build = { }
  316.         for i in range(len(sources)):
  317.             src = sources[i]
  318.             obj = objects[i]
  319.             ext = os.path.splitext(src)[1]
  320.             self.mkpath(os.path.dirname(obj))
  321.             if skip_source[src]:
  322.                 log.debug('skipping %s (%s up-to-date)', src, obj)
  323.                 continue
  324.             build[obj] = (src, ext)
  325.         
  326.         return (macros, objects, extra, pp_opts, build)
  327.  
  328.     
  329.     def _get_cc_args(self, pp_opts, debug, before):
  330.         cc_args = pp_opts + [
  331.             '-c']
  332.         if debug:
  333.             cc_args[:0] = [
  334.                 '-g']
  335.         
  336.         if before:
  337.             cc_args[:0] = before
  338.         
  339.         return cc_args
  340.  
  341.     
  342.     def _fix_compile_args(self, output_dir, macros, include_dirs):
  343.         """Typecheck and fix-up some of the arguments to the 'compile()'
  344.         method, and return fixed-up values.  Specifically: if 'output_dir'
  345.         is None, replaces it with 'self.output_dir'; ensures that 'macros'
  346.         is a list, and augments it with 'self.macros'; ensures that
  347.         'include_dirs' is a list, and augments it with 'self.include_dirs'.
  348.         Guarantees that the returned values are of the correct type,
  349.         i.e. for 'output_dir' either string or None, and for 'macros' and
  350.         'include_dirs' either list or None.
  351.         """
  352.         if output_dir is None:
  353.             output_dir = self.output_dir
  354.         elif type(output_dir) is not StringType:
  355.             raise TypeError, "'output_dir' must be a string or None"
  356.         
  357.         if macros is None:
  358.             macros = self.macros
  359.         elif type(macros) is ListType:
  360.             if not self.macros:
  361.                 pass
  362.             macros = macros + []
  363.         else:
  364.             raise TypeError, "'macros' (if supplied) must be a list of tuples"
  365.         if include_dirs is None:
  366.             include_dirs = self.include_dirs
  367.         elif type(include_dirs) in (ListType, TupleType):
  368.             if not self.include_dirs:
  369.                 pass
  370.             include_dirs = list(include_dirs) + []
  371.         else:
  372.             raise TypeError, "'include_dirs' (if supplied) must be a list of strings"
  373.         return (output_dir, macros, include_dirs)
  374.  
  375.     
  376.     def _prep_compile(self, sources, output_dir, depends = None):
  377.         """Decide which souce files must be recompiled.
  378.  
  379.         Determine the list of object files corresponding to 'sources',
  380.         and figure out which ones really need to be recompiled.
  381.         Return a list of all object files and a dictionary telling
  382.         which source files can be skipped.
  383.         """
  384.         objects = self.object_filenames(sources, strip_dir = python_build, output_dir = output_dir)
  385.         if not len(objects) == len(sources):
  386.             raise AssertionError
  387.         if self.force:
  388.             skip_source = { }
  389.             for source in sources:
  390.                 skip_source[source] = 0
  391.             
  392.         elif depends is None:
  393.             skip_source = { }
  394.             for source in sources:
  395.                 skip_source[source] = 1
  396.             
  397.             (n_sources, n_objects) = newer_pairwise(sources, objects)
  398.             for source in n_sources:
  399.                 skip_source[source] = 0
  400.             
  401.         else:
  402.             skip_source = { }
  403.             L = depends[:] + [
  404.                 None]
  405.             for i in range(len(objects)):
  406.                 source = sources[i]
  407.                 L[-1] = source
  408.                 if newer_group(L, objects[i]):
  409.                     skip_source[source] = 0
  410.                     continue
  411.                 skip_source[source] = 1
  412.             
  413.         return (objects, skip_source)
  414.  
  415.     
  416.     def _fix_object_args(self, objects, output_dir):
  417.         """Typecheck and fix up some arguments supplied to various methods.
  418.         Specifically: ensure that 'objects' is a list; if output_dir is
  419.         None, replace with self.output_dir.  Return fixed versions of
  420.         'objects' and 'output_dir'.
  421.         """
  422.         if type(objects) not in (ListType, TupleType):
  423.             raise TypeError, "'objects' must be a list or tuple of strings"
  424.         
  425.         objects = list(objects)
  426.         if output_dir is None:
  427.             output_dir = self.output_dir
  428.         elif type(output_dir) is not StringType:
  429.             raise TypeError, "'output_dir' must be a string or None"
  430.         
  431.         return (objects, output_dir)
  432.  
  433.     
  434.     def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
  435.         """Typecheck and fix up some of the arguments supplied to the
  436.         'link_*' methods.  Specifically: ensure that all arguments are
  437.         lists, and augment them with their permanent versions
  438.         (eg. 'self.libraries' augments 'libraries').  Return a tuple with
  439.         fixed versions of all arguments.
  440.         """
  441.         if libraries is None:
  442.             libraries = self.libraries
  443.         elif type(libraries) in (ListType, TupleType):
  444.             if not self.libraries:
  445.                 pass
  446.             libraries = list(libraries) + []
  447.         else:
  448.             raise TypeError, "'libraries' (if supplied) must be a list of strings"
  449.         if library_dirs is None:
  450.             library_dirs = self.library_dirs
  451.         elif type(library_dirs) in (ListType, TupleType):
  452.             if not self.library_dirs:
  453.                 pass
  454.             library_dirs = list(library_dirs) + []
  455.         else:
  456.             raise TypeError, "'library_dirs' (if supplied) must be a list of strings"
  457.         if runtime_library_dirs is None:
  458.             runtime_library_dirs = self.runtime_library_dirs
  459.         elif type(runtime_library_dirs) in (ListType, TupleType):
  460.             if not self.runtime_library_dirs:
  461.                 pass
  462.             runtime_library_dirs = list(runtime_library_dirs) + []
  463.         else:
  464.             raise TypeError, "'runtime_library_dirs' (if supplied) " + 'must be a list of strings'
  465.         return (libraries, library_dirs, runtime_library_dirs)
  466.  
  467.     
  468.     def _need_link(self, objects, output_file):
  469.         """Return true if we need to relink the files listed in 'objects'
  470.         to recreate 'output_file'.
  471.         """
  472.         if self.force:
  473.             return 1
  474.         elif self.dry_run:
  475.             newer = newer_group(objects, output_file, missing = 'newer')
  476.         else:
  477.             newer = newer_group(objects, output_file)
  478.         return newer
  479.  
  480.     
  481.     def detect_language(self, sources):
  482.         '''Detect the language of a given file, or list of files. Uses
  483.         language_map, and language_order to do the job.
  484.         '''
  485.         if type(sources) is not ListType:
  486.             sources = [
  487.                 sources]
  488.         
  489.         lang = None
  490.         index = len(self.language_order)
  491.         for source in sources:
  492.             (base, ext) = os.path.splitext(source)
  493.             extlang = self.language_map.get(ext)
  494.             
  495.             try:
  496.                 extindex = self.language_order.index(extlang)
  497.                 if extindex < index:
  498.                     lang = extlang
  499.                     index = extindex
  500.             continue
  501.             except ValueError:
  502.                 continue
  503.             
  504.  
  505.         
  506.         return lang
  507.  
  508.     
  509.     def preprocess(self, source, output_file = None, macros = None, include_dirs = None, extra_preargs = None, extra_postargs = None):
  510.         """Preprocess a single C/C++ source file, named in 'source'.
  511.         Output will be written to file named 'output_file', or stdout if
  512.         'output_file' not supplied.  'macros' is a list of macro
  513.         definitions as for 'compile()', which will augment the macros set
  514.         with 'define_macro()' and 'undefine_macro()'.  'include_dirs' is a
  515.         list of directory names that will be added to the default list.
  516.  
  517.         Raises PreprocessError on failure.
  518.         """
  519.         pass
  520.  
  521.     
  522.     def compile(self, sources, output_dir = None, macros = None, include_dirs = None, debug = 0, extra_preargs = None, extra_postargs = None, depends = None):
  523.         '''Compile one or more source files.
  524.  
  525.         \'sources\' must be a list of filenames, most likely C/C++
  526.         files, but in reality anything that can be handled by a
  527.         particular compiler and compiler class (eg. MSVCCompiler can
  528.         handle resource files in \'sources\').  Return a list of object
  529.         filenames, one per source filename in \'sources\'.  Depending on
  530.         the implementation, not all source files will necessarily be
  531.         compiled, but all corresponding object filenames will be
  532.         returned.
  533.  
  534.         If \'output_dir\' is given, object files will be put under it, while
  535.         retaining their original path component.  That is, "foo/bar.c"
  536.         normally compiles to "foo/bar.o" (for a Unix implementation); if
  537.         \'output_dir\' is "build", then it would compile to
  538.         "build/foo/bar.o".
  539.  
  540.         \'macros\', if given, must be a list of macro definitions.  A macro
  541.         definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
  542.         The former defines a macro; if the value is None, the macro is
  543.         defined without an explicit value.  The 1-tuple case undefines a
  544.         macro.  Later definitions/redefinitions/ undefinitions take
  545.         precedence.
  546.  
  547.         \'include_dirs\', if given, must be a list of strings, the
  548.         directories to add to the default include file search path for this
  549.         compilation only.
  550.  
  551.         \'debug\' is a boolean; if true, the compiler will be instructed to
  552.         output debug symbols in (or alongside) the object file(s).
  553.  
  554.         \'extra_preargs\' and \'extra_postargs\' are implementation- dependent.
  555.         On platforms that have the notion of a command-line (e.g. Unix,
  556.         DOS/Windows), they are most likely lists of strings: extra
  557.         command-line arguments to prepand/append to the compiler command
  558.         line.  On other platforms, consult the implementation class
  559.         documentation.  In any event, they are intended as an escape hatch
  560.         for those occasions when the abstract compiler framework doesn\'t
  561.         cut the mustard.
  562.  
  563.         \'depends\', if given, is a list of filenames that all targets
  564.         depend on.  If a source file is older than any file in
  565.         depends, then the source file will be recompiled.  This
  566.         supports dependency tracking, but only at a coarse
  567.         granularity.
  568.  
  569.         Raises CompileError on failure.
  570.         '''
  571.         (macros, objects, extra_postargs, pp_opts, build) = self._setup_compile(output_dir, macros, include_dirs, sources, depends, extra_postargs)
  572.         cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
  573.         for obj in objects:
  574.             
  575.             try:
  576.                 (src, ext) = build[obj]
  577.             except KeyError:
  578.                 continue
  579.  
  580.             self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
  581.         
  582.         return objects
  583.  
  584.     
  585.     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
  586.         """Compile 'src' to product 'obj'."""
  587.         pass
  588.  
  589.     
  590.     def create_static_lib(self, objects, output_libname, output_dir = None, debug = 0, target_lang = None):
  591.         '''Link a bunch of stuff together to create a static library file.
  592.         The "bunch of stuff" consists of the list of object files supplied
  593.         as \'objects\', the extra object files supplied to
  594.         \'add_link_object()\' and/or \'set_link_objects()\', the libraries
  595.         supplied to \'add_library()\' and/or \'set_libraries()\', and the
  596.         libraries supplied as \'libraries\' (if any).
  597.  
  598.         \'output_libname\' should be a library name, not a filename; the
  599.         filename will be inferred from the library name.  \'output_dir\' is
  600.         the directory where the library file will be put.
  601.  
  602.         \'debug\' is a boolean; if true, debugging information will be
  603.         included in the library (note that on most platforms, it is the
  604.         compile step where this matters: the \'debug\' flag is included here
  605.         just for consistency).
  606.  
  607.         \'target_lang\' is the target language for which the given objects
  608.         are being compiled. This allows specific linkage time treatment of
  609.         certain languages.
  610.  
  611.         Raises LibError on failure.
  612.         '''
  613.         pass
  614.  
  615.     SHARED_OBJECT = 'shared_object'
  616.     SHARED_LIBRARY = 'shared_library'
  617.     EXECUTABLE = 'executable'
  618.     
  619.     def link(self, target_desc, objects, output_filename, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  620.         '''Link a bunch of stuff together to create an executable or
  621.         shared library file.
  622.  
  623.         The "bunch of stuff" consists of the list of object files supplied
  624.         as \'objects\'.  \'output_filename\' should be a filename.  If
  625.         \'output_dir\' is supplied, \'output_filename\' is relative to it
  626.         (i.e. \'output_filename\' can provide directory components if
  627.         needed).
  628.  
  629.         \'libraries\' is a list of libraries to link against.  These are
  630.         library names, not filenames, since they\'re translated into
  631.         filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
  632.         on Unix and "foo.lib" on DOS/Windows).  However, they can include a
  633.         directory component, which means the linker will look in that
  634.         specific directory rather than searching all the normal locations.
  635.  
  636.         \'library_dirs\', if supplied, should be a list of directories to
  637.         search for libraries that were specified as bare library names
  638.         (ie. no directory component).  These are on top of the system
  639.         default and those supplied to \'add_library_dir()\' and/or
  640.         \'set_library_dirs()\'.  \'runtime_library_dirs\' is a list of
  641.         directories that will be embedded into the shared library and used
  642.         to search for other shared libraries that *it* depends on at
  643.         run-time.  (This may only be relevant on Unix.)
  644.  
  645.         \'export_symbols\' is a list of symbols that the shared library will
  646.         export.  (This appears to be relevant only on Windows.)
  647.  
  648.         \'debug\' is as for \'compile()\' and \'create_static_lib()\', with the
  649.         slight distinction that it actually matters on most platforms (as
  650.         opposed to \'create_static_lib()\', which includes a \'debug\' flag
  651.         mostly for form\'s sake).
  652.  
  653.         \'extra_preargs\' and \'extra_postargs\' are as for \'compile()\' (except
  654.         of course that they supply command-line arguments for the
  655.         particular linker being used).
  656.  
  657.         \'target_lang\' is the target language for which the given objects
  658.         are being compiled. This allows specific linkage time treatment of
  659.         certain languages.
  660.  
  661.         Raises LinkError on failure.
  662.         '''
  663.         raise NotImplementedError
  664.  
  665.     
  666.     def link_shared_lib(self, objects, output_libname, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  667.         self.link(CCompiler.SHARED_LIBRARY, objects, self.library_filename(output_libname, lib_type = 'shared'), output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)
  668.  
  669.     
  670.     def link_shared_object(self, objects, output_filename, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  671.         self.link(CCompiler.SHARED_OBJECT, objects, output_filename, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)
  672.  
  673.     
  674.     def link_executable(self, objects, output_progname, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, debug = 0, extra_preargs = None, extra_postargs = None, target_lang = None):
  675.         self.link(CCompiler.EXECUTABLE, objects, self.executable_filename(output_progname), output_dir, libraries, library_dirs, runtime_library_dirs, None, debug, extra_preargs, extra_postargs, None, target_lang)
  676.  
  677.     
  678.     def library_dir_option(self, dir):
  679.         """Return the compiler option to add 'dir' to the list of
  680.         directories searched for libraries.
  681.         """
  682.         raise NotImplementedError
  683.  
  684.     
  685.     def runtime_library_dir_option(self, dir):
  686.         """Return the compiler option to add 'dir' to the list of
  687.         directories searched for runtime libraries.
  688.         """
  689.         raise NotImplementedError
  690.  
  691.     
  692.     def library_option(self, lib):
  693.         """Return the compiler option to add 'dir' to the list of libraries
  694.         linked into the shared library or executable.
  695.         """
  696.         raise NotImplementedError
  697.  
  698.     
  699.     def has_function(self, funcname, includes = None, include_dirs = None, libraries = None, library_dirs = None):
  700.         '''Return a boolean indicating whether funcname is supported on
  701.         the current platform.  The optional arguments can be used to
  702.         augment the compilation environment.
  703.         '''
  704.         import tempfile as tempfile
  705.         if includes is None:
  706.             includes = []
  707.         
  708.         if include_dirs is None:
  709.             include_dirs = []
  710.         
  711.         if libraries is None:
  712.             libraries = []
  713.         
  714.         if library_dirs is None:
  715.             library_dirs = []
  716.         
  717.         (fd, fname) = tempfile.mkstemp('.c', funcname, text = True)
  718.         f = os.fdopen(fd, 'w')
  719.         for incl in includes:
  720.             f.write('#include "%s"\n' % incl)
  721.         
  722.         f.write('main (int argc, char **argv) {\n    %s();\n}\n' % funcname)
  723.         f.close()
  724.         
  725.         try:
  726.             objects = self.compile([
  727.                 fname], include_dirs = include_dirs)
  728.         except CompileError:
  729.             return False
  730.  
  731.         
  732.         try:
  733.             self.link_executable(objects, 'a.out', libraries = libraries, library_dirs = library_dirs)
  734.         except (LinkError, TypeError):
  735.             return False
  736.  
  737.         return True
  738.  
  739.     
  740.     def find_library_file(self, dirs, lib, debug = 0):
  741.         """Search the specified list of directories for a static or shared
  742.         library file 'lib' and return the full path to that file.  If
  743.         'debug' true, look for a debugging version (if that makes sense on
  744.         the current platform).  Return None if 'lib' wasn't found in any of
  745.         the specified directories.
  746.         """
  747.         raise NotImplementedError
  748.  
  749.     
  750.     def object_filenames(self, source_filenames, strip_dir = 0, output_dir = ''):
  751.         if output_dir is None:
  752.             output_dir = ''
  753.         
  754.         obj_names = []
  755.         for src_name in source_filenames:
  756.             (base, ext) = os.path.splitext(src_name)
  757.             base = os.path.splitdrive(base)[1]
  758.             base = base[os.path.isabs(base):]
  759.             if ext not in self.src_extensions:
  760.                 raise UnknownFileError, "unknown file type '%s' (from '%s')" % (ext, src_name)
  761.             
  762.             if strip_dir:
  763.                 base = os.path.basename(base)
  764.             
  765.             obj_names.append(os.path.join(output_dir, base + self.obj_extension))
  766.         
  767.         return obj_names
  768.  
  769.     
  770.     def shared_object_filename(self, basename, strip_dir = 0, output_dir = ''):
  771.         if not output_dir is not None:
  772.             raise AssertionError
  773.         if strip_dir:
  774.             basename = os.path.basename(basename)
  775.         
  776.         return os.path.join(output_dir, basename + self.shared_lib_extension)
  777.  
  778.     
  779.     def executable_filename(self, basename, strip_dir = 0, output_dir = ''):
  780.         if not output_dir is not None:
  781.             raise AssertionError
  782.         if strip_dir:
  783.             basename = os.path.basename(basename)
  784.         
  785.         if not self.exe_extension:
  786.             pass
  787.         return os.path.join(output_dir, basename + '')
  788.  
  789.     
  790.     def library_filename(self, libname, lib_type = 'static', strip_dir = 0, output_dir = ''):
  791.         if not output_dir is not None:
  792.             raise AssertionError
  793.         if lib_type not in ('static', 'shared', 'dylib'):
  794.             raise ValueError, '\'lib_type\' must be "static", "shared" or "dylib"'
  795.         
  796.         fmt = getattr(self, lib_type + '_lib_format')
  797.         ext = getattr(self, lib_type + '_lib_extension')
  798.         (dir, base) = os.path.split(libname)
  799.         filename = fmt % (base, ext)
  800.         if strip_dir:
  801.             dir = ''
  802.         
  803.         return os.path.join(output_dir, dir, filename)
  804.  
  805.     
  806.     def announce(self, msg, level = 1):
  807.         log.debug(msg)
  808.  
  809.     
  810.     def debug_print(self, msg):
  811.         DEBUG = DEBUG
  812.         import distutils.debug
  813.         if DEBUG:
  814.             print msg
  815.         
  816.  
  817.     
  818.     def warn(self, msg):
  819.         sys.stderr.write('warning: %s\n' % msg)
  820.  
  821.     
  822.     def execute(self, func, args, msg = None, level = 1):
  823.         execute(func, args, msg, self.dry_run)
  824.  
  825.     
  826.     def spawn(self, cmd):
  827.         spawn(cmd, dry_run = self.dry_run)
  828.  
  829.     
  830.     def move_file(self, src, dst):
  831.         return move_file(src, dst, dry_run = self.dry_run)
  832.  
  833.     
  834.     def mkpath(self, name, mode = 511):
  835.         mkpath(name, mode, self.dry_run)
  836.  
  837.  
  838. _default_compilers = (('cygwin.*', 'unix'), ('os2emx', 'emx'), ('posix', 'unix'), ('nt', 'msvc'), ('mac', 'mwerks'))
  839.  
  840. def get_default_compiler(osname = None, platform = None):
  841.     ''' Determine the default compiler to use for the given platform.
  842.  
  843.         osname should be one of the standard Python OS names (i.e. the
  844.         ones returned by os.name) and platform the common value
  845.         returned by sys.platform for the platform in question.
  846.  
  847.         The default values are os.name and sys.platform in case the
  848.         parameters are not given.
  849.  
  850.     '''
  851.     if osname is None:
  852.         osname = os.name
  853.     
  854.     if platform is None:
  855.         platform = sys.platform
  856.     
  857.     for pattern, compiler in _default_compilers:
  858.         if re.match(pattern, platform) is not None or re.match(pattern, osname) is not None:
  859.             return compiler
  860.             continue
  861.     
  862.     return 'unix'
  863.  
  864. compiler_class = {
  865.     'unix': ('unixccompiler', 'UnixCCompiler', 'standard UNIX-style compiler'),
  866.     'msvc': ('msvccompiler', 'MSVCCompiler', 'Microsoft Visual C++'),
  867.     'cygwin': ('cygwinccompiler', 'CygwinCCompiler', 'Cygwin port of GNU C Compiler for Win32'),
  868.     'mingw32': ('cygwinccompiler', 'Mingw32CCompiler', 'Mingw32 port of GNU C Compiler for Win32'),
  869.     'bcpp': ('bcppcompiler', 'BCPPCompiler', 'Borland C++ Compiler'),
  870.     'mwerks': ('mwerkscompiler', 'MWerksCompiler', 'MetroWerks CodeWarrior'),
  871.     'emx': ('emxccompiler', 'EMXCCompiler', 'EMX port of GNU C Compiler for OS/2') }
  872.  
  873. def show_compilers():
  874.     '''Print list of available compilers (used by the "--help-compiler"
  875.     options to "build", "build_ext", "build_clib").
  876.     '''
  877.     FancyGetopt = FancyGetopt
  878.     import distutils.fancy_getopt
  879.     compilers = []
  880.     for compiler in compiler_class.keys():
  881.         compilers.append(('compiler=' + compiler, None, compiler_class[compiler][2]))
  882.     
  883.     compilers.sort()
  884.     pretty_printer = FancyGetopt(compilers)
  885.     pretty_printer.print_help('List of available compilers:')
  886.  
  887.  
  888. def new_compiler(plat = None, compiler = None, verbose = 0, dry_run = 0, force = 0):
  889.     '''Generate an instance of some CCompiler subclass for the supplied
  890.     platform/compiler combination.  \'plat\' defaults to \'os.name\'
  891.     (eg. \'posix\', \'nt\'), and \'compiler\' defaults to the default compiler
  892.     for that platform.  Currently only \'posix\' and \'nt\' are supported, and
  893.     the default compilers are "traditional Unix interface" (UnixCCompiler
  894.     class) and Visual C++ (MSVCCompiler class).  Note that it\'s perfectly
  895.     possible to ask for a Unix compiler object under Windows, and a
  896.     Microsoft compiler object under Unix -- if you supply a value for
  897.     \'compiler\', \'plat\' is ignored.
  898.     '''
  899.     if plat is None:
  900.         plat = os.name
  901.     
  902.     
  903.     try:
  904.         if compiler is None:
  905.             compiler = get_default_compiler(plat)
  906.         
  907.         (module_name, class_name, long_description) = compiler_class[compiler]
  908.     except KeyError:
  909.         msg = "don't know how to compile C/C++ code on platform '%s'" % plat
  910.         if compiler is not None:
  911.             msg = msg + " with '%s' compiler" % compiler
  912.         
  913.         raise DistutilsPlatformError, msg
  914.  
  915.     
  916.     try:
  917.         module_name = 'distutils.' + module_name
  918.         __import__(module_name)
  919.         module = sys.modules[module_name]
  920.         klass = vars(module)[class_name]
  921.     except ImportError:
  922.         raise DistutilsModuleError, "can't compile C/C++ code: unable to load module '%s'" % module_name
  923.     except KeyError:
  924.         raise DistutilsModuleError, ("can't compile C/C++ code: unable to find class '%s' " + "in module '%s'") % (class_name, module_name)
  925.  
  926.     return klass(None, dry_run, force)
  927.  
  928.  
  929. def gen_preprocess_options(macros, include_dirs):
  930.     """Generate C pre-processor options (-D, -U, -I) as used by at least
  931.     two types of compilers: the typical Unix compiler and Visual C++.
  932.     'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
  933.     means undefine (-U) macro 'name', and (name,value) means define (-D)
  934.     macro 'name' to 'value'.  'include_dirs' is just a list of directory
  935.     names to be added to the header file search path (-I).  Returns a list
  936.     of command-line options suitable for either Unix compilers or Visual
  937.     C++.
  938.     """
  939.     pp_opts = []
  940.     for macro in macros:
  941.         None if type(macro) is TupleType else 1
  942.         if len(macro) == 2:
  943.             if macro[1] is None:
  944.                 pp_opts.append('-D%s' % macro[0])
  945.             else:
  946.                 pp_opts.append('-D%s=%s' % macro)
  947.         macro[1] is None
  948.     
  949.     for dir in include_dirs:
  950.         pp_opts.append('-I%s' % dir)
  951.     
  952.     return pp_opts
  953.  
  954.  
  955. def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):
  956.     """Generate linker options for searching library directories and
  957.     linking with specific libraries.  'libraries' and 'library_dirs' are,
  958.     respectively, lists of library names (not filenames!) and search
  959.     directories.  Returns a list of command-line options suitable for use
  960.     with some compiler (depending on the two format strings passed in).
  961.     """
  962.     lib_opts = []
  963.     for dir in library_dirs:
  964.         lib_opts.append(compiler.library_dir_option(dir))
  965.     
  966.     for dir in runtime_library_dirs:
  967.         opt = compiler.runtime_library_dir_option(dir)
  968.         if type(opt) is ListType:
  969.             lib_opts = lib_opts + opt
  970.             continue
  971.         lib_opts.append(opt)
  972.     
  973.     for lib in libraries:
  974.         (lib_dir, lib_name) = os.path.split(lib)
  975.         if lib_dir:
  976.             lib_file = compiler.find_library_file([
  977.                 lib_dir], lib_name)
  978.             if lib_file:
  979.                 lib_opts.append(lib_file)
  980.             else:
  981.                 compiler.warn("no library file corresponding to '%s' found (skipping)" % lib)
  982.         lib_file
  983.         lib_opts.append(compiler.library_option(lib))
  984.     
  985.     return lib_opts
  986.  
  987.